const express = require('express')
const jwt = require('jsonwebtoken')
const User = require('../models/User')
const config = require('../config')

const router = express.Router()

// 用户注册
router.post('/register', async (req, res) => {
  try {
    const { username, email, password, nickname } = req.body

    // 基本验证
    if (!username || !email || !password) {
      return res.status(400).json({
        success: false,
        message: '用户名、邮箱和密码不能为空'
      })
    }

    // 检查用户是否已存在
    const existingUser = await User.findByEmailOrUsername(email)
    if (existingUser) {
      return res.status(400).json({
        success: false,
        message: '用户名或邮箱已存在'
      })
    }

    // 创建用户
    const newUser = await User.create({ username, email, password, nickname })

    // 生成JWT
    const token = jwt.sign(
      { userId: newUser.id, username: newUser.username },
      config.jwt.secret,
      { expiresIn: config.jwt.expiresIn }
    )

    res.status(201).json({
      success: true,
      message: '注册成功',
      data: {
        user: newUser,
        token
      }
    })
  } catch (error) {
    console.error('注册错误:', error)

    if (error.code === 'ER_DUP_ENTRY') {
      return res.status(400).json({
        success: false,
        message: '用户名或邮箱已存在'
      })
    }

    res.status(500).json({
      success: false,
      message: '服务器内部错误'
    })
  }
})

// 用户登录
router.post('/login', async (req, res) => {
  try {
    const { emailOrUsername, password } = req.body

    // 基本验证
    if (!emailOrUsername || !password) {
      return res.status(400).json({
        success: false,
        message: '邮箱/用户名和密码不能为空'
      })
    }

    // 查找用户
    const user = await User.findByEmailOrUsername(emailOrUsername)
    if (!user) {
      return res.status(401).json({
        success: false,
        message: '用户不存在或密码错误'
      })
    }

    // 验证密码
    const isValidPassword = await User.verifyPassword(
      password,
      user.password_hash
    )
    if (!isValidPassword) {
      return res.status(401).json({
        success: false,
        message: '用户不存在或密码错误'
      })
    }

    // 生成JWT
    const token = jwt.sign(
      { userId: user.id, username: user.username },
      config.jwt.secret,
      { expiresIn: config.jwt.expiresIn }
    )

    // 返回用户信息（不包含密码）
    const { password_hash, ...userInfo } = user

    res.json({
      success: true,
      message: '登录成功',
      data: {
        user: userInfo,
        token
      }
    })
  } catch (error) {
    console.error('登录错误:', error)
    res.status(500).json({
      success: false,
      message: '服务器内部错误'
    })
  }
})

// 获取当前用户信息
router.get('/me', async (req, res) => {
  try {
    const token = req.headers.authorization?.replace('Bearer ', '')

    if (!token) {
      return res.status(401).json({
        success: false,
        message: '未提供访问令牌'
      })
    }

    // 验证JWT
    const decoded = jwt.verify(token, config.jwt.secret)
    const user = await User.findById(decoded.userId)

    if (!user) {
      return res.status(401).json({
        success: false,
        message: '用户不存在'
      })
    }

    res.json({
      success: true,
      data: { user }
    })
  } catch (error) {
    console.error('获取用户信息错误:', error)

    if (error.name === 'JsonWebTokenError') {
      return res.status(401).json({
        success: false,
        message: '无效的访问令牌'
      })
    }

    if (error.name === 'TokenExpiredError') {
      return res.status(401).json({
        success: false,
        message: '访问令牌已过期'
      })
    }

    res.status(500).json({
      success: false,
      message: '服务器内部错误'
    })
  }
})

module.exports = router
